#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# Python内置了字典：dict的支持，dict全称dictionary，在其他语言中也称为map，使用键-值（key-value）存储，
# 具有极快的查找速度
# 索引方式：先在字典的索引表里（比如部首表）查这个字对应的页码，然后直接翻到该页，找到这个字。无论找哪个字，
# 这种查找速度都非常快，不会随着字典大小的增加而变慢
student = {'Jack' : 90, 'Tom' : 88}
print(student['Jack'])

# 避免key不存在的错误
# 通过in判断key是否存在
print("PIPI" in student)
# 通过dict提供的get方法，如果key不存在，可以返回None，或者自己指定的value
print(student.get('Thomas'))
print(student.get('Thomas', -1))
# 注意：返回None的时候Python的交互式命令行不显示结果

# 要删除一个key，用pop(key)方法，对应的value也会从dict中删除
student.pop('Jack')
print('>>>', student)


# dict的key必须是不可变对象
# 这个通过key计算位置的算法称为哈希算法（Hash）
# 在Python中，字符串、整数等都是不可变的，因此，可以放心地作为key。而list是可变的，就不能作为key

# 和list比较，dict有以下几个特点：
#
# 查找和插入的速度极快，不会随着key的增加而变慢；
# 需要占用大量的内存，内存浪费多。
# 而list相反：
#
# 查找和插入的时间随着元素的增加而增加；
# 占用空间小，浪费内存很少。
# 所以，dict是用空间来换取时间的一种方法。

# set和dict类似，也是一组key的集合，但不存储value。由于key不能重复，所以，在set中，没有重复的key
sv = set([1, 2, 3])
print(sv)
# 注意，传入的参数[1, 2, 3]是一个list，而显示的{1, 2, 3}只是告诉你这个set内部有1，2，3这3个元素，
# 显示的顺序也不表示set是有序的。

# 重复元素在set中自动被过滤
sv1 = set([1, 2, 3, 2, 2, 3])
print(sv1)

# set可以看成数学意义上的无序和无重复元素的集合，因此，两个set可以做数学意义上的交集、并集等操作
s1 = set([1,2, 3])
s2 = set([3, 5])
print(s1 & s2)
print(s1 | s2)

# et和dict的唯一区别仅在于没有存储对应的value
st = set((1,2, 2))
print(st)

